#include "hw.h"
#include "uart.h"


// 初始化 USART2（串口0）：115200 8N1
void uart_init(void) {
    // 使能GPIOA和USART1时钟
    RCC_APB2ENR |= (1 << 2) | (1 << 14);  // GPIOA=bit2，USART1=bit14

    // 配置PA9为复用推挽输出（USART1_TX）
    GPIOA_CRH &= ~(0xF << 4);  // 清除PA9配置（bit4-7）
    GPIOA_CRH |= (0xB << 4);   // 复用推挽，50MHz

    // 配置USART1：115200 8N1（APB2时钟=8MHz）
    USART1_BRR = 0x45;         // 8MHz / (16*115200) ≈ 4.34 → 0x45
    USART1_CR1 &= ~(1 << 12);  // 8位数据
    USART1_CR1 &= ~(1 << 10);  // 无奇偶校验
    USART1_CR2 &= ~(3 << 12);  // 1位停止位
    USART1_CR1 |= (1 << 3) | (1 << 0);  // 使能发送和USART1
}

// 发送一个字符（轮询方式）
static void uart_putc(char c) {
    while (!(USART1_SR & (1 << 7)));  // 等待TXE=1
    USART1_DR = c;
}

// 发送字符串
void uart_puts(const char *str) {
    while (*str) {
        uart_putc(*str++);
    }
}